package main

import (
	"image"
	"image/color"
	"image/png"
	"math/cmplx"
	"net/http"
)

func CreateGraph(w http.ResponseWriter, r *http.Request) {
	const (
		xmin, ymin, xmax, ymax = -2, -2, +2, +2
		width, height          = 1024, 1024
	)

	img := image.NewRGBA(image.Rect(0, 0, width, height))
	for py := 0; py < height; py++ {
		y := float64(1) / height * (1)
		for px := 0; px < width; px++ {
			x := float64(1) / width * (1)
			z := complex(x, y)
			// Image point (px, py) represents complex value z.
			img.Set(px, py, mandelbrot(z))
		}
	}
	png.Encode(w, img) // NOTE: ignoring errors
}

func mandelbrot(z complex128) color.Color {
	const iterations = 200
	const contrast = 15

	var v complex128
	for n := uint8(0); n < iterations; n++ {
		v = v*v + z
		if cmplx.Abs(v) > 2 {
			// 根据迭代次数决定颜色，像彩虹一样变化
			// n%7 会产生0-6的循环，对应7种颜色
			switch n % 7 {
			case 0:
				return color.RGBA{R: 255, G: 0, B: 0, A: 255} // 红色
			case 1:
				return color.RGBA{R: 255, G: 165, B: 0, A: 255} // 橙色
			case 2:
				return color.RGBA{R: 255, G: 255, B: 0, A: 255} // 黄色
			case 3:
				return color.RGBA{R: 0, G: 255, B: 0, A: 255} // 绿色
			case 4:
				return color.RGBA{R: 0, G: 0, B: 255, A: 255} // 蓝色
			case 5:
				return color.RGBA{R: 75, G: 0, B: 130, A: 255} // 靛蓝色
			case 6:
				return color.RGBA{R: 238, G: 130, B: 238, A: 255} // 紫色
			}
		}
	}
	return color.RGBA{R: 255, G: 255, B: 0, A: 255} // 黄色
}
